import pandas as pd
import numpy as np
pd.set_option('display.max_rows', None)
pd.set_option('display.width', 5000)
from collections import Counter
def gegu_method1(df:pd.DataFrame)->pd.DataFrame:
    df = df[~df['主动净买'].isin(["0"])]  # 清洗掉异常为0的项
    df = df[~df['主力资金'].isin(["0"])]  # 清洗掉异常为0的项
    df = df[~df['成交额'].isin(["0"])]  # 清洗掉--的数据
    # 2.1 空值替换为str
    df['板块热门'].fillna("其他", inplace=True)  # 替换
    # 2.2 单位替换成统一
    # print(df["{}".format("主力资金")])
    df.loc[:, '主力资金'] = round(wanAndyi_method(df, "主力资金"), 2)
    df.loc[:, "主动净买"] = round(wanAndyi_method(df, "主动净买"), 2)
    df.loc[:, "成交额"] = round(wanAndyi_method(df, "成交额"), 2)
    return df
def wanAndyi_method(df_:pd.DataFrame,str:str)->pd.Series:
    """
    选择df列，进行整合
    """
    return df_["{}".format(str)].apply(lambda x: x[:-1]).astype(float)*df_["{}".format(str)].apply(lambda x: 0.0001 if x[-1]=="万" else 1)
# ————————————————————————————————————————————————————————————
def gegu_method2(df:pd.DataFrame)->pd.DataFrame:
    # 3 数据整合
    # 3.1 获取板块与板块code一一对应关系
    df_bk_code = df[['板块', '板块code']].drop_duplicates()
    # 3.2 df.pivot
    # 3.2.1 整合

    ret1 = df.pivot_table(index=['板块热门', '板块'], values=['主力资金', '股票', "板块code", "主动净买"],aggfunc={'主力资金': np.sum, '股票': np.count_nonzero})  # ,'主动净买':[min, max, np.mean]
    """                 主力资金  股票
                板块热门 板块                  
                NAN  乳制品    -0.055500   2
                     体育      0.041600   1"""
    # 3.2.2降序排列加降维、合并，显示最好的几个板块
    ret1 = ret1.sort_values(by=['主力资金', '股票'], ascending=False).reset_index()
    merge = pd.merge(ret1, df_bk_code, on=['板块'])
    # print(merge)
    """    板块热门     板块       主力资金  股票    板块code
            0     热门     白酒  42.765800  10  GN300200
            1     其他     光伏  25.564800  26  GN300031
            2     其他   珠宝首饰  21.860000   1  GN302083
            3     其他   稀土永磁  14.540000   2  GN300171
            4     热门   食品饮料  13.268000  39  GN302951
            5     热门    乳制品   8.398400  11  GN300297"""
    #df_ = merge.set_index(["板块热门", '板块']).sort_values(by=['主力资金', '股票'], ascending=False)
    df_ = merge.sort_values(by=['主力资金', '股票'], ascending=False)

    df_ = df_[(df_['主力资金'] > 3)]
    return  df_
    # print("其次",df_[(df_['主力资金']>5)|(df_['股票']>5)])

    """                 主力资金  股票    板块code
        板块热门 板块                            
        热门   白酒     42.765800  10  GN300200
        其他   光伏     25.564800  26  GN300031
             珠宝首饰   21.860000   1  GN302083
             稀土永磁   14.540000   2  GN300171
        热门   食品饮料   13.268000  39  GN302951
             乳制品     8.398400  11  GN300297
        其他   航运      6.232200   2  GN300276"""

def gegu_method4(df:pd.DataFrame)->pd.DataFrame:
    """
    板块热门    板块   主力资金  股票    板块code       day
    0     热门   锂电池  31.10  39  GN300118  20210930
    1     其他  电气设备  11.21  33  GN302050  20210930
    2     热门    电力   8.72  16  GN302950  20210930

    """
    """.reset_index()
        光伏      9
        锂电池     7
        白酒      7
    """
    #1.计数并转化为df板块
    print(df.head(15))
    df_bk_count3=df["板块"].value_counts()
    df_bk_count3=df_bk_count3[df_bk_count3>=3].reset_index()
    df_bk_count3.columns = ['板块', 'number']
    #2.合并
    """
    整合时间pd.pivot_table     板块热门    板块   主力资金  股票    板块code       day  number
42    其他    光伏  17.62  34  GN300031  20210915       9
41    其他    光伏  16.14  12  GN300031  20210917       9
40    其他    光伏  14.53  18  GN300031  20210922       9
39    其他    光伏   5.02   7  GN300031  20210923       9
38    其他    光伏  34.42  32  GN300031  20210924       9
37    其他    光伏  16.78  14  GN300031  20210927       9
36    其他    光伏   9.94  15  GN300031  20210928       9
35    其他    光伏  13.18  19  GN300031  20210929       9
34    其他    光伏   4.41  17  GN300031  20210930       9
62    其他    白酒   6.89   5  GN300200  20210916       7
61    热门    白酒  46.94  13  GN300200  20210917       7
60    其他    白酒   6.47   3  GN300200  20210923       7
59    热门    白酒  44.94  14  GN300200  20210924       7
58    热门    白酒  95.05  19  GN300200  20210927       7
57    其他    白酒   6.26   1  GN300200  20210928       7
56    其他    白酒   3.79   8  GN300200  20210929       7
6     其他   锂电池   8.25  27  GN300118  20210915       7
5     其他   锂电池   5.07  10  GN300118  20210922       7
4     其他   锂电池   6.90   5  GN300118  20210923       7
3     其他   锂电池   6.21  22  GN300118  20210924       7
2     其他   锂电池  11.11  11  GN300118  20210927       7
1     其他   锂电池   3.68  13  GN300118  20210929       7
0     热门   锂电池  31.10  39  GN300118  20210930       7
88    其他  电子元件   3.46   7  GN300103  20210915       6
87    其他  电子元件   3.43  12  GN300103  20210917       6
86    其他  电子元件   4.24  11  GN300103  20210922       6
85    其他  电子元件   9.78  12  GN300103  20210923       6
84    其他  电子元件   3.08  17  GN300103  20210924       6
83    其他  电子元件   5.54  12  GN300103  20210927       6
25    热门    风电  25.44  24  GN300162  20210915       6
24    热门    风电  16.54  20  GN300162  20210917       6
23    热门    风电   4.06  19  GN300162  20210922       6
22    其他    风电   5.60   6  GN300162  20210924       6
21    其他    风电   8.16  15  GN300162  20210928       6
20    其他    风电   6.44   9  GN300162  20210930       6
47    其他    化工  14.42  34  GN301153  20210915       5
46    其他    化工   7.04  21  GN301153  20210916       5
    """
    merge = pd.merge(df,df_bk_count3, on=['板块']).sort_values(by=['number',"板块","day",],ascending=[False,True,True])
    """
    """
    merge_show=merge.set_index(['板块', '板块code', 'number', '板块热门', ])
    print("整合时间pd.pivot_table",merge_show)
    #
    # bkandday_df=pd.DataFrame(df.groupby(by=['板块'])['day'].count()).reset_index().sort_values(by="day", ascending=False)
    # print(pd.pivot_table(df, index=["板块", '板块code', "板块热门"],values=['day',"主力资金","股票"],aggfunc={'day': np.count_nonzero}))
    return merge
# ————————————————————————————————————————————————————————————
def gegu_method3(df:pd.DataFrame,method="None")->pd.DataFrame:
    """
        股票      现价   涨停时刻  几天几板   板块(涨停数)   封单(元)     换手率    量比     主力资金   股性  开板次数   板上成交额     成交额     流通值     总市值      昨涨幅                                           揭秘                code                                                 行业
0   世茂能源#605028   27.05  09:41    首板     电力(9)   3856万  18.54%  0.70    7397万   64     0   1.31亿   1.97亿  10.82亿  43.28亿   -2.81%         <font color='#333333'>涨停揭秘：电力</font>  {'code': '605028'}  4    {'code': 'GN302950'}\r\nName: param, dtyp...
0   通宝能源#600780    4.68  09:46    首板     电力(9)   3345万   2.00%  1.12    4678万   68     0   6274万   1.05亿  53.66亿  53.66亿   -6.39%         <font color='#333333'>涨停揭秘：电力</font>  {'code': '600780'}  4    {'code': 'GN302950'}\r\nName: param, dtyp...
0    新中港#605162   12.73  10:16    首板     电力(9)   3012万  20.67%  0.82    1.08亿   74     1   1.58亿   2.08亿  10.20亿  50.98亿   -9.04%         <font color='#333333'>涨停揭秘：电力</font>  {'code': '605162'}  4    {'code': 'GN302950'}\r\nName: param, dtyp...
0   乐山电力#600644    8.17  13:23  4天2板     电力(9)   4572万  11.23%  1.38    1.25亿   72     3   3.77亿   4.92亿  43.99亿  43.99亿   -9.83%         <font color='#333333'>涨停揭秘：电力</font>  {'code': '600644'}  4    {'code': 'GN302950'}\r\nName: param, dtyp...

    :param df:
    :return:
    """
    df['股票']=df['股票'].str.split('#', expand=True)
    df["板块"]=df["板块(涨停数)"].str.split('(', expand=True)[0]

    df["揭秘"]=df["揭秘"].str.split('：', expand=True)[1].str.split('</', expand=True)[0]
    df.loc[:, '板上成交额'] = round(wanAndyi_method(df, "板上成交额"), 2)
    df.loc[:, '主力资金'] = round(wanAndyi_method(df, "主力资金"), 2)
    df.loc[:, '成交额'] = round(wanAndyi_method(df, "成交额"), 2)
    df.loc[:, '流通值'] = round(wanAndyi_method(df, "流通值"), 2)

    if method=="1":
        #print(df["行业"].apply(pd.Series)[0].apply(pd.Series))
        df["行业"] = df["行业"].apply(pd.Series)[0].apply(pd.Series)
        df["code"] = df.code.apply(pd.Series)[0].apply(pd.Series)
        return df

    #print("::::::::::::::::::::::::::::::::::::")
    #print(df["行业"].apply(pd.Series)[0].apply(pd.Series))

    df["行业"] = df.行业.apply(lambda x: x[11:19])

    df["code"]=df.code.apply(lambda x: x[11:17])

    # print(df[["行业","code"]])
    # print("::::::::::::::::::::::::::::::::::::")
    print(df)
    print("->df正则成功")
    """
          股票      现价   涨停时刻  几天几板   板块(涨停数)   封单(元)     换手率    量比  主力资金   股性  开板次数  板上成交额    成交额      流通值     总市值      昨涨幅         揭秘    code        行业     板块
    0   凤凰光学   16.94  09:25    首板   电子元件(3)   2.64亿   0.25%  0.12  0.07   74     0   0.10   0.10    40.23  47.70亿   -1.41%  电子元件+利好公告  600071  GN300103   电子元件
    0    华尔泰   16.57  09:25   2连板     化工(4)   7.88亿   0.26%  1.07  0.04   26     0   0.04   0.04    13.75  54.99亿  +43.98%    次新股一字连板  001217  GN301153     化工
    0  *ST晨鑫    1.96  09:25    首板     芯片(4)    855万   0.39%  0.54  0.05   72     0   0.11   0.11    27.97  27.97亿   -0.53%       ST板块  002447  GN300441     芯片
    0  *ST中迪    4.38  09:31    首板    房地产(2)   1133万   1.02%  0.28  0.04   89     0   0.06   0.13    12.79  13.11亿   -0.95%       ST板块  000609  GN300313    房地产
    """
    bk_list=gegu_method3_1(df)
    return bk_list
    #todo
    # a=df.pivot_table(index=['板块'], values=["股票"],aggfunc=np.count_nonzero)
    # a_sort=a.sort_values(by=[ '股票'], ascending=False).reset_index()
    # print(a_sort[(a_sort["股票"]>3)])

def f5(seq, idfun=None): #list去重复
    """
    python中如何消除list中的冗余项
    like['电气设备', '电气设备', '电力', '电气设备', '电力', '电气设备', '锂电池',]
    ->like['电气设备', '电力', '锂电池', '光伏', '化工']
    """
   # order preserving
    if idfun is None:
        def idfun(x): return x
    seen = {}
    result = []
    for item in seq:
        marker = idfun(item)
        # in old Python versions:
        # if seen.has_key(marker)
        # but in new ones:
        if marker in seen: continue
        seen[marker] = 1
        result.append(item)
    return result
def gegu_method3_1(df: pd.DataFrame) -> list:
    df_time_choose=df.sort_values(by=['涨停时刻'], ascending=True)
    a_=df_time_choose[["股票","涨停时刻","几天几板","板块","封单(元)","行业"]]
    #todo #板块监控
    i=200
    gu_df=a_[:i+1]
    gu_df=gu_df[~gu_df.股票.str.contains('ST')]#去ST
    """
      股票   涨停时刻  几天几板    板块  封单(元)
    33  凤凰光学  09:25    首板  电子元件  2.64亿
    26   华尔泰  09:25   2连板    化工  7.88亿
    63   友讯达  09:32    首板   物联网  7637万
    """
    # print(gu_df)
    #第二次出现的板块list
    gu_df_bklist=gu_df[gu_df.duplicated(['板块'])].板块.tolist()#like['电气设备', '电气设备', '电力', '电气设备', '电力', '电气设备', '锂电池', '锂电池', '光伏', '锂电池', '化工']
    gu_df_hangyelist=gu_df[gu_df.duplicated(['板块'])].行业.tolist()
    print("->Warnning,按时间顺序，如下板块超过2只个股涨停，请关注", f5(gu_df_bklist),f5(gu_df_hangyelist))

    return (gu_df,f5(gu_df_bklist),f5(gu_df_hangyelist))
# ————————————————————————————————————————————————————————————

def df_methodPass10(time_,bk_code,*args,**kwargs):
    """
    当日板块涨幅超过9.9的个数
    :param time_:时间
    :param bk_code:板块代码
    :param args:path_位置
    :param kwargs:
    :return:
    """
    #print(time_,bk_code)
    # path_="D:/mysqldb/pycharm move/pycharm xiangmu/01/py3.9/db/dxw/gegu/{}.json".format(time_)
    path_=args[0]
    df_=pd.read_csv(path_, index_col= 0)
    df_['涨幅']=Quqianhou_method(df_,"涨幅")
    return len(df_[(df_["板块code"]==bk_code)&(df_["涨幅"]>9.9)])

def Quqianhou_method(df_:pd.DataFrame,str:str)->pd.Series:

    return df_["{}".format(str)].apply(lambda x: 1 if x[:1]=="+" else -1)*df_["{}".format(str)].apply(lambda x: x[1:-1]).astype(float)
# ————————————————————————————————————————————————————————————
def gegu_method5(df_:pd.DataFrame):
    df_['涨幅']=Quqianhou_method(df_,"涨幅")
    df_.loc[:, '净买入'] = round(wanAndyi_method(df_, "净买入"), 2)
    print(df_[(df_.涨幅>0)])
    return df_
if __name__ == '__main__':
    df_method("20210915","GN300031")
